/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ec.socialfun.servicios.externos;

import com.ec.socialfun.entidades.Parametros;
import com.ec.socialfun.entidades.Usuario;
import com.ec.socialfun.enumeradores.ParametrosEnum;
import com.ec.socialfun.excepciones.EnvioMailException;
import com.ec.socialfun.excepciones.ParametroException;
import com.ec.socialfun.servicios.ParametrosFacade;
import com.ec.socialfun.servicios.UsuarioFacade;
import java.io.File;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.ejb.EJB;
import javax.ejb.Singleton;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import org.jboss.logging.Logger;

/**
 *
 * @author hp
 */
@Singleton
public class EnvioDeMailServicio {

    private static final Logger LOG = Logger.getLogger(EnvioDeMailServicio.class.getName());
    @EJB
    private ParametrosFacade parametrosFacade;
    @EJB
    private UsuarioFacade usuarioFacade;

    public void enviarMailDeConfirmacion(Usuario usuario) throws EnvioMailException {
        LOG.info("Se enviara el mail de confirmacion a: ");
        LOG.info("codigo de usuario: " + usuario.getUsCodigo());
        LOG.info("codigo activacion: " + usuario.getUsCodigoActivacion());
        try {

            final Parametros mailSocialFun = parametrosFacade.recuperaPorNombre(ParametrosEnum.MAIL_INFO.getNombre());
            final Parametros passMailSocialFun = parametrosFacade.recuperaPorNombre(ParametrosEnum.PASS_MAIL_INFO.getNombre());
            final Parametros smtpHost = parametrosFacade.recuperaPorNombre(ParametrosEnum.MAIL_SMTP_HOST.getNombre());
            final Parametros smtpPort = parametrosFacade.recuperaPorNombre(ParametrosEnum.MAIL_SMTP_PORT.getNombre());
            final Parametros socialFunHost = parametrosFacade.recuperaPorNombre(ParametrosEnum.SOCIAL_FUN_HOST.getNombre());


            Properties props = new Properties();
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.starttls.enable", "true");
            props.put("mail.smtp.host", smtpHost.getPaValor());
            props.put("mail.smtp.port", smtpPort.getPaValor());

            Session session = Session.getInstance(props,
                    new javax.mail.Authenticator() {
                        protected PasswordAuthentication getPasswordAuthentication() {
                            return new PasswordAuthentication(mailSocialFun.getPaValor(), passMailSocialFun.getPaValor());
                        }
                    });



            MimeMessage message = new MimeMessage(session);
            message.setText(textoMail(socialFunHost, usuario), "ISO-8859-1",
                    "html");
            message.setFrom(new InternetAddress(mailSocialFun.getPaValor()));
            message.setRecipients(Message.RecipientType.TO,
                    InternetAddress.parse(usuario.getUsCorreo()));
            message.setSubject("Informacion Social FUN");
            //message.setText();

            Transport.send(message);


            LOG.info("Mail enviado ");

        } catch (MessagingException e) {
            LOG.error("Error en el envio de mail  de confirmacion " + e);
            throw new RuntimeException(e);
        } catch (ParametroException e) {
            LOG.error("Error al obtener parametros para enviar confirmacion " + e);
            throw new EnvioMailException("Error al obtener parametros para enviar confirmacion");
        }

    }

    private String textoMail(Parametros socialFunHost, Usuario usuario) {
        String texto = "<h1>SOCIAL FUN</h1>"
                + "\n\n Queremos darte la bienvenida a nuestro sitio web Social Full Fun, donde ofrecemos todos los contenidos que hemos elaborado para ti; dicho contenido se encuentra dirigido a gente divertida como tú. Somos líderes en asesorarte donde se encuentra el mejor entretenimiento y diversión. Deseamos que encuentres funcional y útil nuestra página y quedamos a tu entera disposición."
                + " \n\n da Click:  <a href=\"" + socialFunHost.getPaValor() + "/activarUsuario?codigoActivacion=" + usuario.getUsCodigoActivacion()
                + "\">aqui</a>";

        LOG.info("texto del mail = " + texto);
        return texto;
    }

    /**
     * Metodo que envia la tarjeta virtual al correo del usuario
     *
     * @param mailUsuario
     * @param tarjetaVirtual
     * @throws EnvioMailException
     */
    public void enviarTarjetaVirtual(String mailUsuario, File tarjetaVirtual) throws EnvioMailException {
        try {
            Usuario usuario = usuarioFacade.recuperaUsuarioPorMail(mailUsuario);

            final Parametros mailSocialFun = parametrosFacade.recuperaPorNombre(ParametrosEnum.MAIL_INFO.getNombre());
            final Parametros passMailSocialFun = parametrosFacade.recuperaPorNombre(ParametrosEnum.PASS_MAIL_INFO.getNombre());
            final Parametros smtpHost = parametrosFacade.recuperaPorNombre(ParametrosEnum.MAIL_SMTP_HOST.getNombre());
            final Parametros smtpPort = parametrosFacade.recuperaPorNombre(ParametrosEnum.MAIL_SMTP_PORT.getNombre());

            Properties props = new Properties();
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.starttls.enable", "true");
            props.put("mail.smtp.host", smtpHost.getPaValor());
            props.put("mail.smtp.port", smtpPort.getPaValor());

            Session session = Session.getInstance(props,
                    new javax.mail.Authenticator() {
                        protected PasswordAuthentication getPasswordAuthentication() {
                            return new PasswordAuthentication(mailSocialFun.getPaValor(), passMailSocialFun.getPaValor());
                        }
                    });

            // Se compone la parte del texto
            BodyPart texto = new MimeBodyPart();
            texto.setText("Tarjeta Virtual SOCIAL FUN....");

            // Se compone el adjunto con la imagen
            BodyPart adjunto = new MimeBodyPart();
            adjunto.setDataHandler(
                    new DataHandler(new FileDataSource(tarjetaVirtual)));
            adjunto.setFileName("tarjeta.jpg");

            // Una MultiParte para agrupar texto e imagen.
            MimeMultipart multiParte = new MimeMultipart();
            multiParte.addBodyPart(texto);
            multiParte.addBodyPart(adjunto);

            // Se compone el correo, dando to, from, subject y el
            // contenido.
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(mailSocialFun.getPaValor()));
            message.addRecipient(
                    Message.RecipientType.TO,
                    new InternetAddress(usuario.getUsCorreo()));
            message.setSubject("Tarjeta Virtual");
            message.setContent(multiParte);

            Transport.send(message);
            LOG.info("Mail enviado ....");


        } catch (ParametroException e) {
            LOG.error("Error al obtener parametros para enviar tarejta virtual " + e);
            throw new EnvioMailException("Error al obtener parametros para enviar tarejta virtual");
        } catch (MessagingException e) {
            LOG.error("Error al enviar tarjeta virtual " + e);
            throw new EnvioMailException("Error al obtener parametros para enviar tarjeta virtual");
        }

    }

    /**
     * envio de mail de sugerencias o comentarios por parte del usuario CLIENTE
     *
     * @param usuario
     * @param comentario
     * @throws EnvioMailException
     */
    public void enviarMailDeComentarios(Usuario usuario, String comentario) throws EnvioMailException {
        LOG.info("Se enviara el mail de confirmacion a: ");
        LOG.info("codigo de usuario: " + usuario.getUsCodigo());
        LOG.info("codigo activacion: " + usuario.getUsCodigoActivacion());
        try {

            final Parametros mailSocialFun = parametrosFacade.recuperaPorNombre(ParametrosEnum.MAIL_COMENT.getNombre());
            final Parametros passMailSocialFun = parametrosFacade.recuperaPorNombre(ParametrosEnum.PASS_MAIL_COMENT.getNombre());
            final Parametros smtpHost = parametrosFacade.recuperaPorNombre(ParametrosEnum.MAIL_SMTP_HOST.getNombre());
            final Parametros smtpPort = parametrosFacade.recuperaPorNombre(ParametrosEnum.MAIL_SMTP_PORT.getNombre());


            Properties props = new Properties();
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.starttls.enable", "true");
            props.put("mail.smtp.host", smtpHost.getPaValor());
            props.put("mail.smtp.port", smtpPort.getPaValor());

            Session session = Session.getInstance(props,
                    new javax.mail.Authenticator() {
                        protected PasswordAuthentication getPasswordAuthentication() {
                            return new PasswordAuthentication(mailSocialFun.getPaValor(), passMailSocialFun.getPaValor());
                        }
                    });



            MimeMessage message = new MimeMessage(session);
            message.setText(textoMailComentario(usuario, comentario), "ISO-8859-1",
                    "html");
            message.setFrom(new InternetAddress(mailSocialFun.getPaValor()));
            message.setRecipients(Message.RecipientType.TO,
                    InternetAddress.parse(mailSocialFun.getPaValor()));
            message.setSubject("Informacion Social FUN");
            //message.setText();

            Transport.send(message);


            LOG.info("Mail enviado ");

        } catch (MessagingException e) {
            LOG.error("Error en el envio de mail  de confirmacion " + e);
            throw new EnvioMailException("Error en el envio de mail  de confirmacion ");
        } catch (ParametroException e) {
            LOG.error("Error al obtener parametros para enviar confirmacion " + e);
            throw new EnvioMailException("Error al obtener parametros para enviar confirmacion");
        }

    }

    /*
     * metodo que crea el texto a enviar en el mail de comentarios
     */
    private String textoMailComentario(Usuario usuario, String comentario) {
        String texto = "<h3>SOCIAL FULL FUN COMENTARIOS</h3>"
                + "Usuario: " + usuario.getUsNombre() + " " + usuario.getUsPrimerApellido() + "<br/>"
                + "Pais: " + usuario.getZoCodigo().getCiCodigo().getPaCodigo().getPaNombre() + "<br/>"
                + "Telefono: " + usuario.getUsTelefono() + "<br/>"
                + "Correo: " + usuario.getUsCorreo() + "<br/>"
                + "Comentario: " + comentario;


        LOG.info("texto del mail = " + texto);
        return texto;
    }
}
